home *** CD-ROM | disk | FTP | other *** search
/ TeX 1995 July / TeX CD-ROM July 1995 (Disc 1)(Walnut Creek)(1995).ISO / dviware / kyocera / kyodev.c < prev    next >
C/C++ Source or Header  |  1990-10-01  |  3KB  |  169 lines

  1. /* kyodev.c The kyocera output driver for dvi2kyo program.
  2.  * Copyright 1987 State University Groningen, Netherlands
  3.  * Author: kees@guvaxin.uucp
  4.  */
  5.  
  6. #include <stdio.h>
  7. #include "dev.h"
  8. #include "kyo.h"
  9.  
  10. #define DEV_DPI             300 /* Device dots per inch */
  11. #define DEV_XOFFSET         200
  12. #define DEV_YOFFSET         300
  13.  
  14. FILE *dev_out;
  15. long dev_h,dev_v;
  16. unsigned long dev_options;
  17.  
  18. /* Map the ASCII codes 0-060 to 0240-0320
  19.  * because the Kyocera can not print symbols with
  20.  * codes 0-040 in each emulation mode, and the ASCII
  21.  * sequence !R! brings it into PRESCRIBE command mode
  22.  */
  23. unsigned char visual(ch)
  24.      unsigned long ch;
  25. {
  26.   if (ch < 060) ch += 0240;
  27.   return((unsigned char)ch);
  28. }
  29.  
  30. /* Print symbol "ch" from current font
  31.  * and update the horizontal cursor position
  32.  */
  33. dev_setc(ch,xsize)
  34.      unsigned long ch;
  35.      int xsize;
  36. {
  37.   putc(visual(ch), dev_out);
  38.   dev_h += xsize;
  39. }
  40.  
  41. /* Print symbol "c" by sending the pixel raster 
  42.  * The raster info is converted to a vectorlike image
  43.  * and the symbol is printed by drawing lines
  44.  */
  45. dev_raster(c)
  46.      struct kyochar *c;
  47. {
  48.   int i,w,row,l,s,bw;
  49.   unsigned short *bp, x;
  50.  
  51.   debug("Output raster info\n");
  52.   bp = c->kc_glyph.p;
  53.   bw = (c->kc_width + 15) / 16;
  54.   fprintf(dev_out, "!R! SCP;MRP %1d,%1d;", -(c->kc_xoffset), -(c->kc_yoffset));
  55.   for (row=0; row<c->kc_height; row++) {
  56.     l = 0; s = 0;
  57.     fprintf(dev_out, "SCP;MRP 0,%1d;", row);
  58.     debug("row: %d\n", row);
  59.     for (w=0; w<bw; w++) {
  60.       x = *bp++;
  61.       if ((w % 8) == 0) debug("\n");
  62.       debug("%o ", x);
  63.       for (i=15; i>=0; i--)
  64.     if (x & (1 << i)) {
  65.       if (s) {
  66.         fprintf(dev_out, "MRP %1d,0;", s);
  67.         s = 0;
  68.       }
  69.       l++;
  70.     } else {
  71.       if (l) {
  72.         fprintf(dev_out, "DRP %1d,0;", l);
  73.         l = 0;
  74.       }
  75.       s++;
  76.     }
  77.     }
  78.     if (l) fprintf(dev_out, "DRP %1d,0;", l);
  79.     fprintf(dev_out, "RPP;");
  80.   }
  81.   fprintf(dev_out, "EXIT;");
  82. }
  83.  
  84. /* Put the cursor on position "(x,y)" */
  85. dev_position(x,y)
  86.      long x,y;
  87. {
  88.   if ((dev_h != x) || (dev_v != y))
  89.       fprintf(dev_out, "!R! MAP %1d,%1d;EXIT;", x, y);
  90.   dev_h = x; dev_v = y;
  91. }
  92.  
  93. /* Draw a filled rectangele */
  94. dev_draw_box(h,w)
  95.      long h,w;
  96. {
  97.   fprintf(dev_out, "!R! BLK %1d,%1d;EXIT;", w, -h);
  98. }
  99.  
  100. /* End of page */
  101. dev_eop()
  102. {
  103.   fprintf(dev_out,"!R! PAGE;EXIT;");
  104.   fflush(dev_out);
  105.   dev_h = dev_v = 0;
  106. }
  107.  
  108. /* Initialize Kyocera */
  109. hard_init()
  110. {
  111.   fprintf(dev_out, "!R! RES;UNIT D;SLM %1d;STM %1d;SPD 1;EXIT;"
  112.          , DEV_XOFFSET, DEV_YOFFSET);
  113.   page_init();
  114. }
  115.  
  116. /* Initialization at each page begin */
  117. page_init()
  118. {
  119.   dev_h = dev_v = 0;
  120. }
  121.  
  122. /* Initialization routine called by device independent part */
  123. dev_init(f,options,dpi)
  124.      FILE *f;
  125.      unsigned long options;
  126.      long *dpi;
  127. {
  128.   dev_out = f;
  129.   *dpi = DEV_DPI;
  130.   dev_options = options;
  131.   hard_init();
  132. }
  133.  
  134. /* Terminate use of device */
  135. dev_term()
  136. {
  137.   fprintf(dev_out, "!R! PAGE;RES; EXIT;!R! RES; EXIT;");
  138.   fflush(dev_out);
  139. }
  140.  
  141. /* Print error log */
  142. dev_print_log(f)
  143.      FILE *f;
  144. {
  145.   register int ch;
  146.  
  147.   if (dev_h || dev_v) putc('\f',dev_out);
  148.   fprintf(dev_out, "!R! FONT 1;EXIT;");
  149.   while (!ferror(f) && (ch = getc(f)) != EOF) {
  150.     if (ch == '\n') putc('\r',dev_out);
  151.     putc(ch,dev_out);
  152.   }
  153.   putc('\f',dev_out);
  154.   fflush(dev_out);
  155. }
  156.  
  157. /* Handle special DVI commands
  158.  * "nchars" are copied from file "f"
  159.  * directly to the Kyocera
  160.  */
  161. dev_special(nchars,f)
  162.      int nchars;
  163.      FILE *f;
  164. {
  165.   while (nchars-- > 0) putc(getc(f),dev_out);
  166.   page_init();
  167. }
  168.  
  169.